"""
1、为什么不能一次性读完？
    with open('huge.log', 'r', encoding='utf-8') as f:
        data = f.read() # x
问题：
    * read() 会把整个文件内容加载到内存
    * 文件一旦超过内存，程序直接 OOM(内存溢出)
    所以，处理大文件的核心是：永远不要一次性读完！


2、正确做法：流行逐行读取
2.1 最基础的稳健方案是：
    def read_file_line_by_line(filepath: str):
        with open(filepath, 'r', encoding='utf-8') as f:
            for line in f:
                yield line.rstrip('\n')     # yield 每次返回一行

怎么用？
    for line in read_file_line_by_line('huge.log'):
        if 'ERROR' in line:
            print(line)

yield 的好处：
    * 不是一次性读全部，而是懒加载，一行一行的处理
    * 保证内存占用极低，即使是 100GB 也没问题


3、 更高效的方式：按块（chunk）读取 + yield
    逐行读取有点慢？那可以分块读取，然后用 yield:
    def read_file_in_chunks(filepath: str, chunk_size: int = 1024 * 1024):
        with open(filepath, 'r', encoding='utf-8') as f:
            while True:
                chunk = f.read(chunk_size)
                if not chunk:
                    break
                yield chunk

    每次读 1MB（可以调整），然后按需处理。
    注意：如果按块读取，可能存在行被切断的问题，通常需要自己补全一行。

高级版本是：
def read_file_by_line_efficient(filepath: str, buffer_size: int= 1024*1024):
    with open(filepath,'r', encoding='utf-8') as f:
        buffer = ''
        while True:
            chunk = f.read(buffer_size)
            if not chunk:
                break
            buffer += chunk
            while '\n' in bufffer:
                line,buffer = buffer.split('\n',1)
                yield line
        if buffer:
            yield buffer

    ✨ 这段代码解决了跨块的半行问题！


4、进阶版：加个实时进度显示！
如果你想边读边看进度，可以这样做：

import os

def read_file_with_progress(filepath:str):
    total_size = os.path.getsize(filepath)
    read_size = 0

    with open(filepath,'r', enconding='utf-8') as f:
        for line in f:
            read_size += len(line.encode('utf-8'))
            progress = (read_size / total_size) * 100
            print(f'\r读取进度：{progress: .2f}%', end='')
            yield line.rstrip('\n')


5、小结
  方法                     适合场景             说明
.read()                 小文件（KB/MB）      不推荐大文件
 整体读
逐行 for line in f      大多数大文件场景       稳定可靠
按块 chunk 读取          超大文件、性能要求高   注意跨行处理
加进度显示               体验更好             推荐实际项目用
"""

import os

def read_file_with_progress(filepath: str):
    total_size = os.path.getsize(filepath)
    read_size = 0

    with open(filepath, 'r', encoding='utf-8') as f:
        for line in f:
            read_size += len(line.encode('utf-8'))
            progress = (read_size / total_size) * 100
            print(f'\r读取进度：{progress:.2f}%', end='')
            yield line.rstrip('\n')